package com.example.controller;


import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.example.common.Result;
import com.example.entity.Book;
import com.example.entity.Params;
import com.example.entity.Student;
import com.example.entity.dto.UserDTO;
import com.example.exception.CustomException;
import com.example.service.BookService;
import com.example.service.StudentService;
import com.example.service.TypeService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@CrossOrigin
@RestController
@RequestMapping("/book")
public class BookController {

    @Resource
    private BookService bookService;

    @Autowired
    private StudentService studentService;

    @Autowired
    private TypeService typeService;

    @GetMapping("/search")
    public Result findBySearch(Params params) {
        PageInfo<Book> info = bookService.findBySearch(params);
        return Result.success(info);
    }

    @PostMapping
    public Result save(@RequestBody UserDTO userDTO) {


        if (userDTO.getImg().length() == 0 ){
            return Result.error("图片未上传");
        }
        String s = userDTO.getImg().split("\\.")[0];
        String  studentName = s.substring(11);
        if (!userDTO.getName().equals(studentName) ){
            return Result.error("图片命名错误");
        }


        //根据姓名考号身份证在学生表中查找是否存在该学生
//         userDTO.setPhoto(BaseContext.getCurrentId());
        Student student = studentService.getBy(userDTO);
        if (student == null) {
            return Result.error("该学生不存在");
        } else if (student.getCount() >= 2) {
            return Result.error("已经修改两次了，不能再修改了");
        }
        String number = typeService.selectNumberByIdCard(student.getIdCard());
        int count = bookService.selectCount(number);

        /*
         * 第一次提交，提交状态修改为1（表示已经提交），然后增加修改次数
         * 注意：这里还得补充
         * 第二次提交，增加修改次数
         * */
        if (count==0) {
//            bookService.add(userDTO);
            typeService.updateStatus(userDTO);
            studentService.updataCount(userDTO);
            bookService.addStudent(userDTO);
        } else {
//            bookService.update(userDTO);
            studentService.updataCount(userDTO);
//            typeService.updateStatus(userDTO);
            bookService.updateStudent(userDTO);
        }
        return Result.success();
    }

    //
//    @DeleteMapping("/{id}")
//    public Result delete(@PathVariable Integer id) {
//        bookService.delete(id);
//        return Result.success();
//    }
    @GetMapping("/export")
    public Result export(HttpServletResponse response) throws IOException {
        // 思考：
        // 要一行一行的组装数据，塞到一个list里面
        // 每一行数据，其实就对应数据库表中的一行数据，也就是对应Java的一个实体类Type
        // 我们怎么知道它某一列就是对应某个表头呢？？ 需要映射数据，我们需要一个Map<key,value>，把这个map塞到list里

        // 干！
        // 1. 从数据库中查询出所有数据
        List<Book> all = bookService.findAll();

        if (CollectionUtil.isEmpty(all)) {
            throw new CustomException("未找到数据");
        }

        // 2. 定义一个 List，存储处理之后的数据，用于塞到 list 里
        List<Map<String, Object>> list = new ArrayList<>(all.size());

        // 3. 定义Map<key,value> 出来，遍历每一条数据，然后封装到 Map<key,value> 里，把这个 map 塞到 list 里
        for (Book book : all) {
            Map<String, Object> row = new HashMap<>();
            row.put("姓名", book.getName());
            row.put("学号", book.getNumber());
            row.put("学院", book.getCollege());
            row.put("专业", book.getMajor());
            row.put("照片", book.getPhoto());


            list.add(row);
        }

        // 4. 创建一个 ExcelWriter，把 list 数据用这个writer写出来（生成出来）
        ExcelWriter wr = ExcelUtil.getWriter(true);
        wr.write(list, true);

        // 5. 把这个 excel 下载下来
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=idCard.xlsx");
        ServletOutputStream out = response.getOutputStream();
        wr.flush(out, true);
        wr.close();
        IoUtil.close(System.out);
        return Result.success();
    }

}
